package example

import (
	"bufio"
	"fmt"
	"os"
)

// 缓冲区操作 (bufio)

func Case3() {
	fmt.Println("🎯缓冲区操作 (bufio)")

	// 创建测试文件
	file, err := os.Create("bufio.txt")
	if err != nil {
		fmt.Println("文件创建失败：", err)
		return
	}
	//defer os.Remove("bufio.txt")
	defer file.Close()

	// 带缓冲写入数据
	writer := bufio.NewWriter(file)

	// 写入多行
	lines := []string{
		"第一行内容",
		"第二行内容",
		"第三行内容",
	}
	for _, line := range lines {
		n, err := writer.WriteString(line + "\n")
		if err != nil {
			fmt.Println("写入失败， ", err)
			return
		}
		fmt.Printf("写入 %d 字节\n", n)
	}

	// 刷新缓冲区，确保数据写入文件
	err = writer.Flush()
	if err != nil {
		fmt.Println("刷新缓冲区失败，", err)
		return
	}
	fmt.Println("缓冲区已刷新")

	// 带缓冲的读取
	file2, err := os.Open("bufio.txt")
	if err != nil {
		fmt.Println("打开文件失败， %v", file2)
		return
	}

	reader := bufio.NewReader(file2)
	lineNum := 1
	for {
		line, err := reader.ReadString('\n')
		if err != nil {
			if err.Error() == "EOF" {
				break
			}
			fmt.Println("读取数据错误, ", err)
			break
		}
		fmt.Printf("读取,第%d行: %s", lineNum, line)
		lineNum++
	}

	// ReadLine读取
	fmt.Println("ReadLine读取")
	file2.Seek(0, 0)    // 恢复文件指针从头开始
	reader.Reset(file2) // 重置文件
	for {
		line, isPrefix, err := reader.ReadLine()
		if err != nil {
			break
		}
		fmt.Printf("行: %s, isPrefix: %t\n", string(line), isPrefix)
	}

	// Scanner(推荐行读取)
	fmt.Println("Scanner(推荐行读取)")
	file2.Seek(0, 0) // 恢复文件指针从头开始
	scanner := bufio.NewScanner(file2)
	lineCount := 0
	for scanner.Scan() {
		lineCount++
		fmt.Printf("第%d行: %s\n", lineCount, scanner.Text())
	}
	if err := scanner.Err(); err != nil {
		fmt.Printf("Scanner错误: %v\n", err)
	}

}
